package br.com.fatecjp.pooai.gerenciador.taxi.ui;

import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import br.com.fatecjp.pooai.gerenciador.taxi.ambiente.Ambiente;
import br.com.fatecjp.pooai.gerenciador.taxi.ambiente.Posicao;
import br.com.fatecjp.pooai.gerenciador.taxi.constants.ConstantesAmbiente;
import br.com.fatecjp.pooai.gerenciador.taxi.core.Cliente;
import br.com.fatecjp.pooai.gerenciador.taxi.core.Taxi;

public class AmbienteUIDesktop extends AmbienteUI {

	private List<List<JPanel>> panels;
	private JFrame internalFrame;

	public AmbienteUIDesktop(Ambiente ambiente) {
		super(ambiente);
		this.inicializar();
	}

	private void inicializar() {
		this.inicializarComponentes();
		this.inicializarLayout();
	}

	private void inicializarLayout() {
		GridLayout layout = new GridLayout(ConstantesAmbiente.NUMERO_POSICOES,
				ConstantesAmbiente.NUMERO_POSICOES);
		this.internalFrame.setLayout(layout);
	}

	private void inicializarComponentes() {
		this.internalFrame = new JFrame();
		this.internalFrame.setSize(600, 600);
		this.internalFrame.setResizable(true);
		this.internalFrame.setTitle("Gerenciador de Táxis");
	}

	@Override
	public void exibirUI() {

		this.panels = new ArrayList<List<JPanel>>(
				ConstantesAmbiente.NUMERO_POSICOES);
		for (int i = 0; i < ConstantesAmbiente.NUMERO_POSICOES; i++) {
			ArrayList<JPanel> panelsList = new ArrayList<JPanel>(
					ConstantesAmbiente.NUMERO_POSICOES);
			for (int j = 0; j < ConstantesAmbiente.NUMERO_POSICOES; j++) {
				JPanel panel = new JPanel();
				panel.setBackground(Color.YELLOW);
				this.internalFrame.add(panel);
				panelsList.add(panel);
			}
			this.panels.add(panelsList);
		}

		this.internalFrame.setVisible(true);
		this.internalFrame
				.setLocationRelativeTo(this.internalFrame.getParent());
	}

	@Override
	public void atualizarUI() {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				for (List<JPanel> list : panels) {
					for (JPanel panel : list) {
						panel.setBackground(internalFrame.getBackground());
					}
				}

				Ambiente ambiente = getAmbiente();

				for (Taxi taxi : ambiente.listarTaxis()) {
					Posicao posicao = taxi.getPosicaoAtual();
					if (taxi.isOcupado()) {
						panels.get(posicao.getX()).get(posicao.getY())
								.setBackground(getCorTaxiOcupado());
					} else {
						panels.get(posicao.getX()).get(posicao.getY())
								.setBackground(getCorTaxi());
					}
				}

				for (Cliente cliente : ambiente.listarClientes()) {
					Posicao posicaoCliente = cliente.getPosicaoAtual();
					panels.get(posicaoCliente.getX())
							.get(posicaoCliente.getY())
							.setBackground(getCorCliente());
				}

				for (Posicao destino : ambiente.listarDestinosClientes()) {
					panels.get(destino.getX()).get(destino.getY())
							.setBackground(getCorDestinoCliente());
				}

				internalFrame.repaint();

			}

		});
	}

}
